DEFINITION MODULE  Screen;

(*****************************************************************************)
(* Ermoeglicht Zugriff auf die Terminalemulation des Atari.                  *)
(*                                                                           *)
(* Dieses Modul ist wirklich nur fuer die Ausgabe von TOS/TTP-Programmen ge- *)
(* eignet, da die Steuersequenzen nur fuer diese Emulation passen und deswe- *)
(* gen auch nicht umlenkbar sind; wenn die Terminalausgabe durch "TermWindow"*)
(* wie bei nicht gelinkten Objektmodulen geschieht, nuetzt einem dieses Modul*)
(* wenig.                                                                    *)
(*                                                                           *)
(* Eine allgemein verwendbare, umlenkbare Ausgabefunktion fuer Zeichen ist   *)
(* allerdings "WriteChar".                                                   *)
(*                                                                           *)
(* Zugriffe anderer Module ( z.B. "Terminal" ) auf den TOS-(Text)Bildschirm  *)
(* sollten nur ueber dieses Modul laufen.                                    *)
(*___________________________________________________________________________*)
(*   05-Mae-90 , Holger Kleinschmidt                                         *)
(*****************************************************************************)


  PROCEDURE  WriteRawCon    ((* EIN/ -- *) zeichen : CHAR );

  PROCEDURE  WriteRawConStr ((* EIN/ -- *) string : ARRAY OF CHAR );

 (*------------------------------------------------------------------------
  | Die Zeichenausgabe laeuft ueber das BIOS, aber nicht ueber die Termi-  |
  | nalemulation. Die Zeichen unterhalb 20H, die sonst als Controlcodes    |
  | interpretiert werden, werden als Graphikzeichen ausgegeben.            |
  | Die Ausgabe ist nicht umlenkbar.                                       |
   ------------------------------------------------------------------------*)

  PROCEDURE  WriteCon    ((* EIN/ -- *) zeichen : CHAR );

  PROCEDURE  WriteConStr ((* EIN/ -- *) string : ARRAY OF CHAR );

 (*------------------------------------------------------------------------
  | Wie "WriteRawCon", aber die Ausgabe laeuft ueber die Terminalemulation |
  | ( Controlcodes werden erkannt ).                                       |
   ------------------------------------------------------------------------*)

  PROCEDURE  WriteChar ((* EIN/ -- *) zeichen : CHAR );

  PROCEDURE  WriteStr  ((* EIN/ -- *) string : ARRAY OF CHAR );

 (*------------------------------------------------------------------------
  | Wie "WriteCon", aber die Ausgabe ist umlenkbar ( laeuft ueber GEMDOS ).|
  | Die Ausgabe ist langsamer als die ueber "WriteCon".                    |
   ------------------------------------------------------------------------*)


  PROCEDURE  CursorUp;

  PROCEDURE  CursorUpScroll;

  PROCEDURE  CursorDown;

  PROCEDURE  CursorRight;

  PROCEDURE  CursorLeft;

 (*------------------------------------------------------------------------
  | Die Prozeduren bewegen den Cursor in die jeweils angegeben Richtung;   |
  | stand der Cursor bereits am jeweiligen Rand, passiert nichts, bei      |
  | "CursorUpScroll" wird der Bildschirm jedoch um eine Zeile nach unten   |
  | verschoben.                                                            |
   ------------------------------------------------------------------------*)

  PROCEDURE  CursorHome;

  PROCEDURE  ClearScreen;

 (*------------------------------------------------------------------------
  | Der Cursor wird in die linke obere Ecke gesetzt; "ClearScreen" loescht |
  | zusaetzlich den Bildschirm.                                            |
   ------------------------------------------------------------------------*)

  PROCEDURE  EraseToEndOfPage;

  PROCEDURE  EraseToEndOfLine;

  PROCEDURE  EraseLine;

  PROCEDURE  EraseToStartOfPage;

  PROCEDURE  EraseToStartOfLine;

 (*------------------------------------------------------------------------
  | Loescht den jeweils angegebenen Bereich zwischen Cursor und Zeilen-    |
  | bzw. Seitenrand. Der Cursor bleibt an der bisherigen Position.         |
  | Bei "EraseLine" wird die gesamte Zeile geloescht und der Cursor an den |
  | linken Bildschirmrand gesetzt.                                         |
   ------------------------------------------------------------------------*)

  PROCEDURE  InsertLine;

  PROCEDURE  DeleteLine;

 (*------------------------------------------------------------------------
  | Loescht eine Zeile bzw. fuegt an der Cursorposition eine Leerzeile ein.|
  | Der Cursor bleibt in der bisherigen Zeile und wird an den linken Rand  |
  | gesetzt. Der Bereich zwischen Cursor und unterem Bildschirmrand wird   |
  | entsprechend um eine Zeile nach oben bzw. unten verschoben.            |
   ------------------------------------------------------------------------*)


  PROCEDURE  AutoWrapOn;

  PROCEDURE  AutoWrapOff;

 (*------------------------------------------------------------------------
  | Ist der Autowrap-Modus eingeschaltet, wird bei Erreichen des Zeilen-   |
  | endes automatisch eine neue Zeile begonnen, sonst wird nicht ueber den |
  | Zeilenrand hinausgeschrieben, es muss ein explizites CR-LF ausgegeben  |
  | werden ( WriteLn ).                                                    |
   ------------------------------------------------------------------------*)


  PROCEDURE  GotoXY ((* EIN/ -- *) spalte,
                     (* EIN/ -- *) zeile  : CARDINAL );

 (*------------------------------------------------------------------------
  | Setzt den Cursor auf <zeile> und <spalte>.                             |
  | 0 <= zeile <= 24  und  0 <= spalte <= 79; sind <zeile> oder <spalte>   |
  | groesser, so werden sie auf den jeweiligen Maximalwert gesetzt.        |
   ------------------------------------------------------------------------*)

  PROCEDURE  SaveCursorPos;

  PROCEDURE  RestoreCursorPos;

 (*------------------------------------------------------------------------
  | Speichert intern die momentane Cursorposition bzw. setzt den Cursor    |
  | auf den gespeicherten Wert.                                            |
   ------------------------------------------------------------------------*)

  PROCEDURE  CursorOn;

  PROCEDURE  CursorOff;

 (*------------------------------------------------------------------------
  | Der Cursor wird sichtbar bzw. unsichtbar.                              |
   ------------------------------------------------------------------------*)

  PROCEDURE  CursorBlinkOn;

  PROCEDURE  CursorBlinkOff;

 (*------------------------------------------------------------------------
  | Der Cursor blinkt oder wird dauernd sichtbar.                          |
   ------------------------------------------------------------------------*)


  PROCEDURE  SetBlinkRate ((* EIN/ -- *)     ms : CARDINAL );

  PROCEDURE  GetBlinkRate ((* -- /AUS *) VAR ms : CARDINAL );

  PROCEDURE  RestoreBlinkRate;

 (*------------------------------------------------------------------------
  | Die Blinkgeschwindigkeit des Cursors wird gesetzt bzw. abgefragt.      |
  | <ms> gibt die Periodendauer des Blinkens in Millisekunden an.          |
  | Die genaue Zeit haengt allerdings vom verwendeten Monitor ab ( es wird |
  | Schwarzweiss angenommen) und ist stets ein Vielfaches der doppelten    |
  | Periodendauer der Bildfrequenz.                                        |
  | "RestoreBlinkRate" setzt die Blinkrate auf den Wert, den sie bei       |
  | Programmanfang hatte.                                                  |
   ------------------------------------------------------------------------*)


  PROCEDURE  InverseOn;

  PROCEDURE  InverseOff;

 (*------------------------------------------------------------------------
  | Hintergrund- und Vordergrundfarbe werden ausgetauscht bzw. wieder auf  |
  | den Ursprungswert gesetzt.                                             |
   ------------------------------------------------------------------------*)

  PROCEDURE  SetForegroundColor ((* EIN/ -- *) farbe : CARDINAL );

  PROCEDURE  SetBackgroundColor ((* EIN/ -- *) farbe : CARDINAL );

 (*------------------------------------------------------------------------
  | Setzt die Schrift- bzw. Hintergrundfarbe. Die moeglichen Werte fuer    |
  | <farbe> sind von der Bildschirmaufloesung abhaengig:                   |
  |                                                                        |
  |    Hoch    : 0 <= farbe <= 1                                           |
  |    Mittel  : 0 <= farbe <= 3                                           |
  |    Niedrig : 0 <= farbe <= 15                                          |
   ------------------------------------------------------------------------*)


END  Screen.
